<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>基于vue-router的案例</title>
    <style type="text/css">
      html,
      body,
      #app {
        margin: 0;
        padding: 0px;
        height: 100%;
      }
      .header {
        height: 50px;
        background-color: #545c64;
        line-height: 50px;
        text-align: center;
        font-size: 24px;
        color: #fff;
      }
      .footer {
        height: 40px;
        line-height: 40px;
        background-color: #888;
        position: absolute;
        bottom: 0;
        width: 100%;
        text-align: center;
        color: #fff;
      }
      .main {
        display: flex;
        position: absolute;
        top: 50px;
        bottom: 40px;
        width: 100%;
      }
      .content {
        flex: 1;
        text-align: center;
        height: 100%;
      }
      .left {
        flex: 0 0 20%;
        background-color: #545c64;
      }
      .left a {
        color: white;
        text-decoration: none;
      }
      .right {
        margin: 5px;
      }
      .btns {
        width: 100%;
        height: 35px;
        line-height: 35px;
        background-color: #f5f5f5;
        text-align: left;
        padding-left: 10px;
        box-sizing: border-box;
      }
      button {
        height: 30px;
        background-color: #ecf5ff;
        border: 1px solid lightskyblue;
        font-size: 12px;
        padding: 0 20px;
      }
      .main-content {
        margin-top: 10px;
      }
      ul {
        margin: 0;
        padding: 0;
        list-style: none;
      }
      ul li {
        height: 45px;
        line-height: 45px;
        background-color: #a0a0a0;
        color: #fff;
        cursor: pointer;
        border-bottom: 1px solid #fff;
      }

      table {
        width: 100%;
        border-collapse: collapse;
      }

      td,
      th {
        border: 1px solid #eee;
        line-height: 35px;
        font-size: 12px;
      }

      th {
        background-color: #ddd;
      }

      .router-link-active {
          display: block;
          background-color: yellowgreen;
          color: red!important;
      }
      .nav-login {
          float: right;
          color: #fff;
          padding: 0 10px;
          text-decoration: none;
      }
    </style>
    <script src="js/vue.js"></script>
    <script src="js/vue-router_3.0.2.js"></script>
  </head>
  <body>
    <!-- 要被 vue 实例所控制的区域 -->
    <div id="app">
      <!-- 路由占位符 -->
      <router-view></router-view>
    </div>

    <script>
        // 定义 APP 根组件
        const App = {
        template: `<div>
            <!-- 头部区域 -->
            <header class="header">
                <div>传智后台管理系统
                    <router-link to="/login" class="nav-login" @click.prevent="btnLogin">登录</router-link>
                    <router-link to="/register" class="nav-login" @click.prevent="btnRegister">注册</router-link>
                </div>
            </header>
            <!-- 中间主体区域 -->
            <div class="main">
                <!-- 左侧菜单栏 -->
                <div class="content left">
                    <ul>
                        <li>
                            <router-link to="/users">用户管理</router-link>
                        </li>
                        <li>
                            <router-link to="/rights">权限管理</router-link>
                        </li>
                        <li>
                            <router-link to="/goods">商品管理</router-link>
                        </li>
                        <li>
                            <router-link to="/orders">订单管理</router-link>
                        </li>
                        <li>
                            <router-link to="/settings">系统设置</router-link>
                        </li>
                    </ul>
                </div>
                <!-- 右侧内容区域 -->
                <div class="content right">
                    <div class="main-content">
                        <router-view />
                    </div>
                </div>
            </div>
            <!-- 尾部区域 -->
            <footer class="footer">版权信息</footer>
        </div>`
        }

        const Users = {
            data() {
                return {
                    userlist: [
                        {id:1,name:'初音',gender:'女'},
                        {id:2,name:'佐助',gender:'男'},
                        {id:3,name:'路飞',gender:'男'},
                        {id:4,name:'灵梦',gender:'女'}
                    ]
                }
            },
            template: `<div>
                <h1>这是用户管理页面</h1>
                <hr>
                <table>
                    <thead><tr><th>编号</th><th>姓名</th><th>性别</th><th>操作</th></tr></thead>
                    <tbody>
                        <tr v-for="item in userlist" :key="item.id">
                            <td>{{item.id}}</td>
                            <td>{{item.name}}</td>
                            <td>{{item.gender}}</td>
                            <td>
                                <a href="javascript:;" @click="toDetail(item.id)">详情</a>
                            </td>
                        </tr>
                    </tbody>
                </table>
            </div>`,
            methods: {
                toDetail(id) {
                    let obj = null;
                    this.userlist.some(item => {
                        if(item.id == id) {
                            obj = item;
                            return true;
                        }
                    })
                    //这里传参的格式需要和下面路由的对应，否则报错，用了query传参相当于在?后面传递，对应的路由获取要使用route.query.name接收
                    // this.$router.push({path:`/users/userinfo/${id}`,query:{name}}); 传递单个name属性则上面代码需要简单修改下，将obj缓存name
                    console.log(this.$router);
                    
                    this.$router.push({path:`/users/userinfo/${id}`,query:{obj}});
                },
                btnLogin() {
                    console.log(this.$route);
                    this.$router.push('/login');
                },
                btnRegister() {
                    this.$router.push('/register');
                }
            }
        }
        const Userinfo = {
            props: ['id','obj'],
            template:`<div>
                <h1>这是{{id}}==={{obj.name}}的详情页</h1>
            </div>`
        }
        const Rights = {
            template: `<div>
                <h1>这是权限管理页面</h1>
            </div>`
        }
        const Goods = {
            template: `<div>
                <h1>这是商品管理页面</h1>
            </div>`
        }
        const Orders = {
            template: `<div>
                <h1>这是订单管理页面</h1>
            </div>`
        }
        const Settings = {
            template: `<div>
                <h1>这是系统设置页面</h1>
            </div>`
        }

        const Login = {
            template: `<div>
                <h1>这是登录页面</h1>
            </div>`
        }
        const Register = {
            template: `<div>
                <h1>这是注册页面</h1>
            </div>`
        }


    // 创建路由对象
    const router = new VueRouter({
        routes: [{
            path: '/',
            component: App,
            redirect: '/users',
            children: [
                {path: '/users',component: Users},
                // {path: '/users/userinfo/:id',component: Userinfo,props: route => ({id:route.params.id,name:route.query.name})},
                {path: '/users/userinfo/:id',component: Userinfo,props: route => ({id:route.params.id,obj:route.query.obj})},
                {path: '/rights',component: Rights},
                {path: '/goods',component: Goods},
                {path: '/orders',component: Orders},
                {path: '/settings',component: Settings},
            ]
        },
        // 因为login和register不是在上面的大组件之下，而是要另起页面，故不能写在第一个请求/的页面里，否则会导致请求的页面只是在展示模块显示，不符合正常的需求，正常情况登录和注册页面都应是另起页面的，且不能将现有的结构显示出来
        { path: '/login',component: Login},
        { path: '/register',component: Register}
        ],
        
    })

    // 使用全局前置守卫对异常请求进行拦截，下面的意思是判断用户是否登录，未登录则跳转至登录页面
        // router.beforeEach((to,from,next) => {
        //     // console.log(to);             //可以查看即将要进入的目标路由对象；
        //     // console.log(from);           //可以查看当前导航即将要离开的路由对象；
        //     let isLogin = JSON.parse(localStorage.getItem('userInfo'));
        //     if(isLogin) {
        //         next();         
        //     }else if( to.path === '/login') {
        //         next();
        //     }else {
        //         next('/login');
        //     }
        // })

      const vm = new Vue({
        el: '#app',
        router,
        watch: {
            $route(newUrl,oldUrl) {
                console.log(newUrl,oldUrl);
            }
        }
      })
    </script>
  </body>
</html>
